home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / simulato / v2_3_mc6.tz / v2_3_mc6 / testfiles / hex2bin.asm < prev    next >
Assembly Source File  |  1994-05-02  |  5KB  |  117 lines

  1. **** SUBROUTINE HEX2BIN ****
  2. * This routine is a seperate module from the routine "MAIN".  It's sole
  3. * purpose is to take the parsed ASCII string passed to it and convert it
  4. * to another ASCII string in the form of an equivalent binary number.
  5. * This task is accomplished by first converting the ASCII string into
  6. * it's correct integer, then testing the negative flag (a passed param.)
  7. * , and finally converting the number into the correct binary ASCII string.
  8. * The parameters must be passed on the stack as shown in the following
  9. * diagram:
  10. *
  11. *               |------------------------------------------------|
  12. *               |    POINTER TO STRING TO BE PARSED(LONGWORD)    |
  13. *               |------------------------------------------------|
  14. *               | POINTER TO PLACE WHERE OUTPUT WILL BE(LONGWORD)|
  15. *               |------------------------------------------------|
  16. *               |              NEGATIVE FLAG(WORD)               |
  17. *               |------------------------------------------------|
  18. *
  19. ****************************
  20. **** RESOURCES ****
  21. * INPUTS: negative flag (held by d3)
  22. *         pointer to parsed string (held by a2, last character)
  23. *         pointer to desired output location (held by a5)
  24. * OUTPUT: binary string at location pointed to by a5.
  25. *
  26. * REGISTERS: a2 -> pointer to last char of parsed string.
  27. *            a5 -> pointer to desired output location
  28. *            d2 -> read character from string.
  29. *            d3 -> holder of negative flag.
  30. *            d4 -> final converted number.
  31. *            d5 -> generic counter/holder for multiplication.  
  32. ********************
  33.  
  34.         SECTION H2B,code        ;define section.
  35.         XDEF HEX2BIN            ;point out the two returns defined here.
  36.  
  37. HEX2BIN LINK A6,#0                ;link sub.using a6 as fp, w/ wrd local stor.
  38.         MOVEM.L A0-A5/D0-D7,-(A7) ;save all registers for restore later.
  39.  
  40.         CLR.L D4                ;clear working total register.
  41.         CLR.L D2                ;clear chr. reg. so word mult. ok.
  42.         MOVEA.L 8(A6),A2        ;load in param. for parsed string ch.
  43.         MOVE.L #$01,D5          ;load w/ hex place holder.
  44.  
  45. HEX_NEXTCHR MOVE.B (A2),D2      ;read in LSB/next char. of string.
  46.         CMPI.B #'$',D2          ;is the last char.
  47.         BEQ.S MAKE_BIN_STR      ;if so get out. else,
  48.         SUBQ.L #1,A2            ;decrement to point to next character.
  49.         CMPI.B #'A',D2          ;see if the char. is a # or letter.
  50.         BGE.S HEX_ISLETTER      ;if the parsed char. is >= it is letter
  51.         ANDI.B #$0F,D2          ;else # so strip of top nibble mk #
  52.         BRA.S HEX_UPDATE        ;go to update.
  53. HEX_ISLETTER SUBI.B #$37,D2     ;converts to correct #.
  54. HEX_UPDATE MULU.W D5,D2         ;put the result in the correct place.
  55.         MULU.W #$10,D5          ;update to next place.
  56.         ADD D2,D4               ;update working total.
  57.         BRA.S HEX_NEXTCHR       ;repeat.
  58.  
  59. MAKE_BIN_STR CLR.L D5           ;clear the generic counter.
  60.         MOVE.W 16(A6),D3        ;this is the value of the negative flag
  61.         MOVE.L 12(A6),A5        ;get output pointer parameter.
  62.         TST.W D3                ;test the flag
  63.         BEQ.S HEX_FIRST1        ;if equal not negative
  64.         NEG.W D4                ;else take 2's complement of result.
  65.  
  66. HEX_FIRST1 ROL.W #1,D4          ;get MSB of result.
  67.         BCS.S HEX_GOT1          ;if the result was a one handle it
  68.         CMPI.W #16,D5           ;is end of word.
  69.         BEQ.S HEX_NO1           ;if it is the number was zero.
  70.         ADDQ.W #1,D5            ;increment counter.
  71.         BRA.S HEX_FIRST1        ;and look for next bit.
  72.  
  73. HEX_NO1 MOVE.B #'0',(A5)+       ;move $30 to output string.
  74.         BRA.W HEX_END           ;leave and return.
  75.  
  76. HEX_GOT1 MOVE.B #'1',(A5)+      ;place the initial one in the string.
  77.         CMPI.W #7,D5            ;look for middle.
  78.         BNE.S HEX_NOMID         ;if not middle continue.
  79.         MOVE.B #' ',(A5)+       ;else place a space in the string.
  80.  
  81.  
  82. HEX_NOMID ADDQ.W #1,D5          ;increment the counter.
  83.         CMPI.W #16,D5           ;see if was the only one.
  84.         BGE.W HEX_END           ;if it was leave.
  85.  
  86. HEX_TOEND ROL.W #1,D4           ;get the next bit in the string.
  87.         BCS.S HEX_IS1           ;bit is one so place in string.
  88.         MOVE.B #'0',(A5)+       ;else put a zero.
  89.         BRA.S HEX_SKIP          ;skip placing a 1.
  90.  
  91. HEX_IS1 MOVE.B #'1',(A5)+       ;put 1 in string.
  92.  
  93. HEX_SKIP CMPI.W #7,D5           ;is the string at its middle.
  94.         BNE.S HEX_NOMID2        ;branch
  95.         MOVE.B #' ',(A5)+       ;if is place a blank in string.
  96.  
  97. HEX_NOMID2 CMPI.W #15,D5        ;look for end bit
  98.         BEQ.S HEX_END           ;leave.
  99.         ADDQ.W #1,D5            ;else increment counter
  100.         BRA.S HEX_TOEND         ;and continue processing.
  101.  
  102. HEX_END MOVE.B #0,(A5)          ;place terminator in string.
  103.         MOVEM.L (A7)+,D0-D7/A0-A5 ;restore registers.
  104.         UNLK A6                 ;restore stack
  105.         RTS                     ;return.
  106.  
  107.         END
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.